package com.mo.lib.view.chart

import android.graphics.Color
import android.graphics.Paint
import com.github.mikephil.charting.charts.BarLineChartBase
import com.github.mikephil.charting.charts.CandleStickChart
import com.github.mikephil.charting.charts.Chart
import com.github.mikephil.charting.components.Description
import com.github.mikephil.charting.components.Legend
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.components.YAxis
import com.github.mikephil.charting.data.CandleData
import com.github.mikephil.charting.data.CandleDataSet
import com.github.mikephil.charting.data.CandleEntry
import com.github.mikephil.charting.formatter.ValueFormatter
import com.mo.lib.utils.KLog

/**
 * @ author：mo
 * @ data：2022/6/28:10:06
 * @ 功能：
 */
/** 设置整体属性*/
fun Chart<*>.setChartSetting(setting: (Chart<*>.() -> Unit) = {}): Chart<*> {
    when (this) { // 设置demo
        is CandleStickChart -> { //蜡烛图
            //            this.getDescription().setText("")
            //            this.getDescription().setTextColor(Color.RED)
            //            this.getDescription().setTextSize(16f) //设置描述的文字 ,颜色 大小
            //            this.setNoDataText("无数据噢") //没数据的时候显示
            this.setDrawBorders(false) //是否显示边框
            this.animateX(500) //x轴动画
            this.setTouchEnabled(true) // 设置是否可以触摸
            this.setDragEnabled(true) // 是否可以拖拽
            this.setScaleEnabled(false) // 是否可以缩放 x和y轴, 默认是true
            this.setScaleXEnabled(true) //是否可以缩放 仅x轴
            this.setScaleYEnabled(true) //是否可以缩放 仅y轴
            this.setPinchZoom(true) //设置x轴和y轴能否同时缩放。默认是否
            this.setDoubleTapToZoomEnabled(true) //设置是否可以通过双击屏幕放大图表。默认是true
            this.setHighlightPerDragEnabled(true) //能否拖拽高亮线(数据点与坐标的提示线)，默认是true
            this.setDragDecelerationEnabled(true) //拖拽滚动时，手放开是否会持续滚动，默认是true（false是拖到哪是哪，true拖拽之后还会有缓冲）
            this.setDragDecelerationFrictionCoef(0.99f) //与上面那个属性配合，持续滚动时的速度快慢，[0,1) 0代表立即停止
        }
    }
    this.setting()
    return this
}

/** 设置图例*/
fun Chart<*>.setLegend(legendSetting: (Legend.() -> Unit) = {}): Chart<*> {
    this.legend.setForm(Legend.LegendForm.LINE)
//    this.legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM)//显示位置
//    this.legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT)
//    this.legend.setOrientation(Legend.LegendOrientation.HORIZONTAL)
//    this.legend.setDrawInside(true);
    this.legend.setEnabled(false); //是否开启设置图例
    this.legend.setTextSize(50f); //设置图例文字大小
    this.legend.setTextColor(Color.BLUE); //设置图例文字颜色
    this.legend.setWordWrapEnabled(true); //如果设置为true，那么当图例过多或者过长一行显示不下的时候就会自适应换行
    this.legend.setMaxSizePercent(0.95f);  //设置表格的最大相对大小，默认为0.95f(95%)
    //            legend.setPosition(Legend.LegendPosition.ABOVE_CHART_LEFT);  //设置图例位置
//    this.legend.setForm(Legend.LegendForm.CIRCLE); //设置图例形状:如SQUARE、CIRCLE、LINE、DEFAULT
    this.legend.setXEntrySpace(20f);    //设置图例XY方向的间隔宽度
    this.legend.setYEntrySpace(20f);
    this.legend.setFormToTextSpace(20f);  //设置图例标签到文字之间的距离
    this.legend.setWordWrapEnabled(true); //设置文本包装
    //            LegendEntry legendEntry = new LegendEntry();  //自定义设置图例
    //            legendEntry.label=getString(R.string.customizeLegend);
    //            legendEntry.formColor=Color.RED;
    //            legendEntry.formSize=10;
    //            legend.setCustom(new LegendEntry[]{legendEntry});  //设置图例
    //            legend.setExtra(new LegendEntry[]{legendEntry});  //动态设置自定义图例
    //            legend.resetCustom(); //重置取消自定义的图例
    this.legend.legendSetting()
    return this
}

/** 设置说明*/
fun Chart<*>.setDescription(descriptionSetting: (Description.() -> Unit) = {}): Chart<*> {
    this.description.text = "mo" //描述文字
//    this.description.textColor = Color.RED //描述文字颜色
//    this.description.textSize = 16f //描述文字大小
//    this.description.textAlign = Paint.Align.CENTER;   //文本位置，右下角对标X轴的左、右、居中，默认右
    this.setNoDataText("暂无数据噢!") //没数据的时候显示
    this.description.descriptionSetting()
    return this
}

/** 设置X轴  */
fun Chart<*>.setXAxis(xAxisSetting: (XAxis.() -> Unit) = {}): Chart<*> {
    this.xAxis.setDrawGridLines(false) //是否绘制X轴上的网格线（背景里面的竖线）
    this.xAxis.granularity = 1f //粒度 设置X轴坐标之间的最小间隔（因为此图有缩放功能，X轴,Y轴可设置可缩放）
    this.xAxis.position = XAxis.XAxisPosition.BOTTOM //X轴所在位置   默认为上面,值：BOTTOM,BOTH_SIDED,BOTTOM_INSIDE,TOP,TOP_INSID
//    this.xAxis.setLabelCount(6, false);//      X轴坐标的个数/X轴的刻度数量    第二个参数一般填false     true表示强制设置标签数 可能会导致X轴坐标显示不全等问题
//    this.xAxis.valueFormatter = object : ValueFormatter() {
//        //X轴自定义坐标
//        override fun getFormattedValue(v: Float): String {
//            return if (v < 0) "" else v.toString() + "" //注意这里不需要显示的要改成 ""
//        }
//    }
//    this.xAxis.setAxisLineColor(Color.rgb(245, 133, 179)); //X轴颜色
//    this.xAxis.setAxisLineWidth(2f);   //X轴粗细
//    this.xAxis.setAxisMaximum(5f);   //X轴最大数值
    this.xAxis.setAxisMinimum(0f);   //X轴最小数值
//    mLineChart.setVisibleXRangeMaximum(6);// 设置当前图表中最多在x轴坐标线上显示的刻度线总量
        this.xAxis.xAxisSetting()
    return this
}

/** 设置左Y轴  */
fun Chart<*>.setAxisLeft(leftAxis: (YAxis.() -> Unit) = {}): Chart<*> {
    when (this) {
        is BarLineChartBase<*> -> {
            axisLeft.isEnabled = true //是否可见
//            axisLeft.axisMinimum = 0f //保证Y轴从0开始，不然会上移一点
//            axisLeft.setDrawGridLines(false) //是否绘制Y轴上的网格线（背景里面的横线）
//            axisLeft.textColor = Color.rgb(63, 91, 107) //文本颜色
//            axisLeft.gridColor = Color.rgb(63, 91, 107) //表格线颜色
//            axisLeft.axisLineColor = Color.rgb(63, 91, 107) //Y轴颜色
//            //        axisLeft.setAxisLineWidth(1);           //Y轴粗细
//            axisLeft.granularity = 1f //粒度
//            axisLeft.valueFormatter = object : ValueFormatter() {
//                //Y轴自定义坐标
//                override fun getFormattedValue(v: Float): String { //            return (v.toString() + "").toDouble().getString(0)
//                    return v.toString()
//                }
//            } //        axisLeft.setAxisMaximum(15);   //Y轴最大数值
            //    this.axisMinimum = 0f //Y轴最小数值
            //Y轴坐标的个数    第二个参数一般填false     true表示强制设置标签数 可能会导致X轴坐标显示不全等问题
            //    this.setLabelCount(5, false)
            axisLeft.leftAxis()
        }
    }
    return this
}

/** 设置右Y轴  */
fun Chart<*>.setAxisRight(rightAxis: (YAxis.() -> Unit) = {}): Chart<*> {
    when (this) {
        is BarLineChartBase<*> -> {
//            this.axisRight.isEnabled = true //是否可见
//            this.axisRight.axisMinimum = 0f //保证Y轴从0开始，不然会上移一点
            this.axisRight.rightAxis()
        }
    }
    return this
}

/** 添加蜡烛图数据*/
fun Chart<*>.addCandleStickData(uPcolor: Int, downColor: Int, yVals: List<CandleEntry>) :Chart<*>{
    val candleDataSet = CandleDataSet(yVals, "AA")
    candleDataSet.setDrawValues(false) //设置是否显示蜡烛图上的文字
    candleDataSet.valueTextColor =  Color.BLACK//文字颜色
    candleDataSet.valueTextSize = 14f//文字尺寸
    candleDataSet.isVisible=true
    candleDataSet.shadowColorSameAsCandle = true //设置影线和蜡烛图的颜色一样
    candleDataSet.shadowColor =  Color.BLACK //设置影线的颜色
    candleDataSet.shadowWidth = 0.2f //设置影线的宽度
    candleDataSet.decreasingColor = downColor //设置减少色
    candleDataSet.decreasingPaintStyle =  Paint.Style.FILL //设置减少实心
    candleDataSet.increasingColor = uPcolor //设置增长色
    candleDataSet.increasingPaintStyle =  Paint.Style.FILL //设置增长 实心
    candleDataSet.neutralColor =  Color.BLACK //当天价格开盘价与收盘价一样 不涨不跌（一字线）颜色
//    candleDataSet.isHighlightEnabled = true //设置定位线是否可用
    candleDataSet.highLightColor =  Color.BLACK //设置定位线的颜色
//    candleDataSet.highlightLineWidth = 0.5f //设置定位线的线宽
    candleDataSet.barSpace = 0.3f //0 至1 之间,越小蜡烛图的宽度越宽

    val data = CandleData(candleDataSet)
    (this as CandleStickChart).data = data
    (this as CandleStickChart).invalidate()
    KLog.i("======${    this.data.getDataSetByIndex(0).label}")
    return this
}



















